package com.rabbitmq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Send {
    public static void main(String[] args) {
        //创建工厂对象用于指定链接的信息
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.10.100");//指定链接IP
        factory.setPort(5672);//指定链接端口
        factory.setUsername("maoning");
        factory.setPassword("930105");
        //创建链接以及通道,并添加异常处理同时在try..catch执行完成后自动释放资源
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            /**
             * 声明一个队列
             *  参数 1 为队里名称 取值任意,如果这个名称已经存在则放弃创建,否则在MQ服务器中创建这个队列
             *  参数 2 为是否持久化的队列
             *  参数 3 为是否排外的队列true表示排外同时最多只允许有1个消费者监听这个队列
             *  参数 4 为是否自动删除 true为自动删除 当没有消费者监听这个队列时将自动删除队列以及消息
             *  参数 5 为队列的属性设置通常为null即可
             *  注意:
             *    这个行代码是可选代码,但是要在发送消息前确保队列存在否则将丢失消息
             */
            String queueName = "myQueue";
            channel.queueDeclare(queueName, true, false, false, null);

            String message = "测试消息";
            /**
             * 发送消息到MQ
             * 参数 1 为交换机名称 我们这里没有使用交换机因此为""
             * 参数 2 为消息所携带的RoutingKey,由于没有使用交换机因此这个参数被识别成了队列名称
             * 参数 3 为消息的属性设置 通常为null即可
             * 参数 4 为具体消息数据取值为byte数组(建议String传递消息)
             * 注意:
             *   发送消息前需要确保队列已经存在否则会丢失消息
             */
            channel.basicPublish("", queueName, null, message.getBytes());
            System.out.println("消息发送成功");

        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
